//
// Created by root on 10/3/17.
//

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>		// linux下头文件
#include <time.h>
#include "logger.h"


/*
获得当前时间字符串
@param buffer [out]: 时间字符串
@return 空
*/
void get_local_time(char* buffer) {
    time_t rawtime;
    struct tm* timeinfo;

    time(&rawtime);
    timeinfo = localtime(&rawtime);
    sprintf(buffer, "[%04d-%02d-%02d %02d:%02d:%02d] ",
            (timeinfo->tm_year+1900), timeinfo->tm_mon, timeinfo->tm_mday,
            timeinfo->tm_hour, timeinfo->tm_min, timeinfo->tm_sec);
}

/*
获得文件大小
@param filename [in]: 文件名
@return 文件大小
*/
long get_file_size(char* filename) {
    long length = 0;
    FILE *fp = NULL;

    fp = fopen(filename, "rb");
    if (fp != NULL) {
        fseek(fp, 0, SEEK_END);
        length = ftell(fp);
    }

    if (fp != NULL) {
        fclose(fp);
        fp = NULL;
    }

    return length;
}

static char* concatenate(char* str, char* append) {
    if (append == NULL || strcmp(append, "") == 0) {
        return str;
    }
    int length = strlen(str) + strlen(append) + 1;
    str = realloc(str, length * sizeof(char));
    str = strcat(str, append);
    return str;
}

/*
写入日志文件
@param filename [in]: 日志文件名
@param max_size [in]: 日志文件大小限制
@param buffer [in]: 日志内容
@param buf_size [in]: 日志内容大小
@return 空
*/
void write_log_file(char* filename, long max_size, char* buffer, unsigned buf_size) {
    if (filename != NULL && buffer != NULL) {
        // 文件超过最大限制, 删除
        long length = get_file_size(filename);

        if (length > max_size) {
            unlink(filename); // 删除文件
        }

        // 写日志
        {
            FILE *fp;
            fp = fopen(filename, "at+");
            if (fp != NULL) {
                char now[32];
                memset(now, 0, sizeof(now));
                get_local_time(now);
                fwrite(now, strlen(now), 1, fp);
                fwrite(buffer, buf_size, 1, fp);

                fclose(fp);
                fp = NULL;
            }
        }
    }
}

void write_log1(char* module, char* msg1) {
    char* msg = (char *) malloc(sizeof(char) * 2);
    msg[0] = '\0';
    msg = concatenate(msg, " [");
    msg = concatenate(msg, module);
    msg = concatenate(msg, "] ");
    msg = concatenate(msg, msg1);
    msg = concatenate(msg, "\n");
    write_log_file(DEFAULT_LOG_FILE, FILE_MAX_SIZE, msg, strlen(msg));
}

void write_log2(char* module, char* msg1, char* msg2) {
    char* msg = (char *) malloc(sizeof(char) * 2);
    msg[0] = '\0';
    msg = concatenate(msg, " [");
    msg = concatenate(msg, module);
    msg = concatenate(msg, "] ");
    msg = concatenate(msg, msg1);
    msg = concatenate(msg, msg2);
    msg = concatenate(msg, "\n");
    write_log_file(DEFAULT_LOG_FILE, FILE_MAX_SIZE, msg, strlen(msg));
    //printf("%s", msg);
}

void write_log3(char* module, char* msg1, char* msg2, char* msg3) {
    char* msg = (char *) malloc(sizeof(char) * 2);
    msg[0] = '\0';
    msg = concatenate(msg, " [");
    msg = concatenate(msg, module);
    msg = concatenate(msg, "] ");
    msg = concatenate(msg, msg1);
    msg = concatenate(msg, msg2);
    msg = concatenate(msg, msg3);
    msg = concatenate(msg, "\n");
    write_log_file(DEFAULT_LOG_FILE, FILE_MAX_SIZE, msg, strlen(msg));
    //printf("%s", msg);
}

void write_log4(char* module, char* msg1, char* msg2, char* msg3, char* msg4) {
    char* msg = (char *) malloc(sizeof(char) * 2);
    msg[0] = '\0';
    msg = concatenate(msg, " [");
    msg = concatenate(msg, module);
    msg = concatenate(msg, "] ");
    msg = concatenate(msg, msg1);
    msg = concatenate(msg, msg2);
    msg = concatenate(msg, msg3);
    msg = concatenate(msg, msg4);
    msg = concatenate(msg, "\n");
    write_log_file(DEFAULT_LOG_FILE, FILE_MAX_SIZE, msg, strlen(msg));
}